package cn.edu.tju.elm.service;

import cn.edu.tju.core.model.User;
import cn.edu.tju.core.security.service.UserService;
import cn.edu.tju.elm.model.Credit;
import cn.edu.tju.elm.repository.CreditRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class CreditService {

    @Autowired
    private CreditRepository creditRepository;

    @Autowired
    private UserService userService;

    /**
     * 为用户添加新的积分记录
     * @param credit Credit对象
     * @return 保存后的Credit
     * @throws IllegalArgumentException 用户不存在或参数非法
     */
    public Credit insertCredit(Credit credit) {
        if (credit.getUser() == null || credit.getUser().getId() == null) {
            throw new IllegalArgumentException("用户不能为空");
        }

        // 验证用户是否存在
        Optional<User> userOpt = userService.getUserById(credit.getUser().getId());
        if (userOpt.isPresent()) {
            credit.setUser(userOpt.get());
        } else {
            throw new IllegalArgumentException("指定的用户不存在");
        }

        if (credit.getCreditNum() == null) {
            throw new IllegalArgumentException("积分数不能为空");
        }

        return creditRepository.save(credit);
    }

    /**
     * 获取用户所有积分记录
     * @param userId 用户ID
     * @return Credit列表
     */
    public List<Credit> getCreditByUserId(Long userId) {
        return creditRepository.findByUserId(userId);
    }

    /**
     * 获取用户指定渠道类型的积分
     * @param userId 用户ID
     * @param channelType 渠道类型
     * @return Credit列表
     */
    public List<Credit> getCreditByUserIdAndChannelType(Long userId, Integer channelType) {
        return creditRepository.findByUserIdAndChannelType(userId, channelType);
    }

    /**
     * 获取用户可用积分
     * 这里假设可用积分是未过期且未删除的积分
     * @param userId 用户ID
     * @return Credit列表
     */
    public List<Credit> getAvailableCreditByUserId(Long userId) {
        return creditRepository.findAvailableByUserId(userId);
    }

    /**
     * 获取用户积分总数
     * @param userId 用户ID
     * @return 积分总数
     */
    public Integer getTotalCreditByUserId(Long userId) {
        return creditRepository.sumCreditNumByUserId(userId);
    }
}
